在上次還有提到零知識證明的那個篇章中提到了零知識證明的問題必須要符合「很難被解出」與「很簡單被驗證」這兩項特性,知道了這兩項特性,我們便可以找出需要被證明的題目,之後便可以開始我們的零知識證明,那有什麼樣的題目符合這兩樣特性呢?老實說,其實還挺多這種題目的,如果你努力想想應該都可以想到幾個,而我這邊就舉電腦科學常會碰到的「身分認證」吧!以「身分認證」這個做為命題,讓我們來思考,如何達成零知識證明。
而在開始身分認證之前,因為身分認證會需要用到一種叫做「數位簽章」的技術,如果不太了解的可以參考我上一篇文章,那我們便開始吧!
為什麼說到身分認證是個符合零知識證明的命題呢?首先先搞清楚這個身分認證在做什麼,基本上這個題目就是在證明「我是擁有這把公鑰的主人」,所以會有一把公開的公鑰,我身為一個證明者要來向驗證者證明出我擁有這把公鑰對應的私鑰,我們先來檢查這個命題做為零知識證明的命題是否合適,我們可以依照是否擁有命題該有的兩個特性以及該命題需不需要有零知識證明中「零知識」這個特性做檢查,我們接下來一個一個來檢查吧!
所以從以上的檢查,可以發現這個題目相當適合拿來作為零知識證明的命題,那該如何進行證明呢?
拿剛剛身分認證的題目進行零知識證明非常簡單,我相信聰明的你們肯定已經想到怎麼做了,就跟隨著以下的步驟:
一旦比對成功,就能證明說證明者就是擁有該公鑰的人了...嗎?不,還沒有,因為這套零知識證明的流程並沒有符合零知識證明三大特性中的 健全性 ,假設這個證明者是個壞人,他知道這個公鑰的主人是誰,於是他就照三餐去偷窺該主人傳送出去的訊息,由於網路世界的訊息都會帶有著簽章,他把這些訊息對應到的簽章都蒐集起來,並開始了這次的證明,一旦驗證者好死不死選到要證明者簽的東西,是原本該公鑰的主人已經簽過的訊息,這個壞人就可以拿出對應的簽名來去騙過這個驗證者。那該怎麼辦?很簡單,我們做多次一點就行了,只要我們選到該公鑰的主人沒簽過的訊息,這個壞人就沒辦法通過這次的證明,因此,這個零知識證明的過程會一直重複步驟1到步驟3的動作,而每做一次,證明者是假的的機率便會愈來愈小,直到他小到符合健全性的時候,那便是零知識證明完成的時候,因為這種的零知識證明,需要證明者與驗證者不斷的互動,就像打網球那樣,所以又被稱作是 「交互式零知識證明」 。
交互式零知識證明可以說是零知識證明最早被提出的模型,因為他相當的直觀,也非常容易實作,基本上就只要把互相溝通的協議定義出來,便可以開始執行了,也因為他非常容易理解,所以基本上在網路上用零知識證明作為關鍵字搜尋,通常都會搜尋到以阿里巴巴洞口作為舉例的零知識證明,那些都是所謂的「交互式零知識證明」,然而現實世界中都是用這種交互式零知識證明嗎?很可惜,大多使用零知識證明的情況都不是使用交互式零知識證明,為什麼呢?因為他擁有一些缺陷,至於有哪些缺陷呢?那就留給明天來探討了喔!